﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using imaginecup.information;
using imaginecup.util;

namespace imaginecup.objectManager
{
    public class ObjectManagerData
    {
        
        //인터페이스(패밀리)당 구현 컴포넌트들의 ID(Enum)을 등록할 자료구조
        private List<SComponentTypeID>[] m_InterfaceTypeToComponentTypes;
           // = new List<EComponentTypeID>[EnumIDInfomation.NUM_INTERFACE_ID];

        //메시지에서 지원하는 구현 컴포넌트들의 ID(Enum)을 등록할 자료구조
        private List<SComponentTypeID>[] m_MessageTypeToComponentTypes;
           // = new List<EComponentTypeID>[EnumIDInfomation.NUM_MESSAGE_TYPE_IDS];

        private IComponentInit m_CmpInit;
        private int m_ReferenceCount;
        


        public ObjectManagerData(IComponentInit cmpInit)
        {
            m_ReferenceCount = 0;
            m_CmpInit = cmpInit;

            //인터페이스(패밀리)당 구현 컴포넌트들의 ID(Enum)을 등록할 자료구조
            m_InterfaceTypeToComponentTypes = new List<SComponentTypeID>[cmpInit.GetNumInterfaceIDS()];

            for (int i = 0; i < cmpInit.GetNumInterfaceIDS(); i++)
            {
                m_InterfaceTypeToComponentTypes[i] = new List<SComponentTypeID>();
            }

            //메시지에서 지원하는 구현 컴포넌트들의 ID(Enum)을 등록할 자료구조
            m_MessageTypeToComponentTypes = new List<SComponentTypeID>[cmpInit.GetNumMessageTypeIDS()];

            for (int i = 0; i < cmpInit.GetNumMessageTypeIDS(); i++)
            {
                m_MessageTypeToComponentTypes[i] = new List<SComponentTypeID>();
            }

            ////구현되어 있는 컴포넌트들의 정적함수를 이용하여 자료구조(인터페이스,메세지를 위한)에 등록
            cmpInit.RegisterAllComponent( this );
        }   

        public IComponentInit GetCmpInit()
        {
            return m_CmpInit;
        }


        public List<SComponentTypeID>[] GetInterfaceTypeInfoList()
        {
            return m_InterfaceTypeToComponentTypes;
        }

        public List<SComponentTypeID>[] GetMessageTypeInfoList()
        {
            return m_MessageTypeToComponentTypes;
        }
      
        //메세지에서 지원하는 구현 컴포넌트 ID 등록
        public void RegisterMessageTypeWithComponent(SMessageType a_SMessageID , SComponentTypeID a_SComponentTypeID)
        {
            m_MessageTypeToComponentTypes[a_SMessageID.MessageTypeID].Add(a_SComponentTypeID);
        }

        //인터페이스(패밀리)를 구현하는 컴포넌트들을 자료구조에 등록
        public void RegisterInterfaceWithComponent(SInterfaceID a_SInterfaceID , SComponentTypeID a_SComponentTypeID)
        {
            m_InterfaceTypeToComponentTypes[a_SInterfaceID.InterfaceID].Add(a_SComponentTypeID);
        }     
      
        
        public void Connect()
        {
            m_ReferenceCount++;
        }

        public void DisConnect()
        {
            m_ReferenceCount--;
            if(m_ReferenceCount == 0)
            {
                Release();
            }
        }
        
        private void Release()
        {
            //인터페이스 자료구조 해제
            foreach (List<SComponentTypeID> compTypeList in m_InterfaceTypeToComponentTypes)
                compTypeList.Clear();

            // 메세지 자료구조 해제
            foreach (List<SComponentTypeID> compTypeList in m_MessageTypeToComponentTypes)
                compTypeList.Clear();

            m_InterfaceTypeToComponentTypes = null;
            m_MessageTypeToComponentTypes = null;            
        }
    }
}
